package com.defu.newmall.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class MD5Utils {
 
    /**
     * MD5加密 通过将盐值和密码进行加密，进行混淆
     * 登录的时候就通过密码和数据库中的盐值进行拼接 进行MD5加密后的结果是否相同
     * @param context
     */
    public static String encrypByMd5(String context) {
    try {  
        // 获取一个MD5消息摘要实例
        MessageDigest md = MessageDigest.getInstance("MD5");
        
        // 更新消息摘要，将输入的文本内容转换为字节数组并进行处理
        md.update(context.getBytes());
        
        // 计算消息摘要，得到MD5散列值
        byte[] encryContext = md.digest();
  
        int i;  
        StringBuffer buf = new StringBuffer("");  
        for (int offset = 0; offset < encryContext.length; offset++) {
            // 将字节值转换为无符号整数
            i = encryContext[offset];  
            if (i < 0) i += 256;  // 处理负值
            if (i < 16) buf.append("0");  // 补充前导0，以保证每个字节都被表示为两位十六进制数
            buf.append(Integer.toHexString(i));  // 将字节值转换为十六进制字符串并追加到结果字符串
       }  
       
        // 返回MD5散列值的十六进制表示
        return buf.toString();
    } catch (NoSuchAlgorithmException e) {
        // 处理NoSuchAlgorithmException异常，通常是因为指定的MD5算法不可用
        e.printStackTrace();
        return  null;
    }  
}
 
    public static void main(String[] args) {
    //加密
    //1 生成随机盐值
    String pwd = "1";
    String salt = StrUtils.getComplexRandomString(32);
    //2 通过这个盐值加密
    String md5Pwd = MD5Utils.encrypByMd5(pwd +"yhp"+ salt+"xxxx");
    System.out.println(md5Pwd);
 
    //密码比对
    //1 查询盐值-就是salt
    String saltTmp = salt;
    //3 加密比对
    String pwdTmp = "1";
    String inputMd5Pwd = MD5Utils.encrypByMd5(pwdTmp +"yhp"+ saltTmp+"xxxx");
    if (inputMd5Pwd.equals(md5Pwd)){
        System.out.println("登录成功!");
    }else{
        System.out.println("密码错误");
    }
  }
}